package com.audaque.springboot.foshanupload.schedule.component;

/**
 * @author zgb
 * @desc 问题：Springboot定时器默认的是单线程的: 定时任务只能顺序执行
 * 处理：使用异步注解
 * @date 2022-01-18 20:11:53
 */

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
@Component
@ConditionalOnExpression("${task.demo.switchYn}")
public class AsyncAnnoScheduledTask {
    private Logger logger = LoggerFactory.getLogger(AsyncAnnoScheduledTask.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    private int count = 0;

    @Scheduled(cron = "*/6 * * * * ?")
    /*

    指定线程池
    @Async("threadPoolTaskExecutor")
    已经配置了AsyncConfig时直接使用
    异步方法不能使用static修饰
    异步方法不能与调用方法在同一个类中
    在Async 方法上标注@Transactional是没用的。在Async 方法调用的方法上标注@Transactional 有效。
    */

    @Async
    public void process() {
        logger.info("英文:this is scheduler task runing " + (count++));
    }

    @Scheduled(fixedRate = 6000)
    @Async
    public void currentTime() {
        logger.info("中文:现在时间" + dateFormat.format(new Date()));
    }
}
